﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using BancoSim.Utils.Clases;
using System.Threading;

namespace BancoSim
{
	/// <summary>
	/// Lógica de interacción para ucCaja.xaml
	/// </summary>
	public partial class ucCaja : UserControl
    {
        #region Atributos y propiedades
        public Proceso proceso;          //Proceso aprocesar.
        List<Proceso> listaAProcesar;    //Lista de procesos.
        public ucLista listaProcesos;    //Control para listas de espera.
        bool iniciado = false;           //Indica si la caja inicio a atender una solicitud.
        string atendido;                 //Nombre del proceso atendido.

        public List<Proceso> ListaAProcesar
        {
            get { return listaAProcesar; }
            set { listaAProcesar = value; }
        }


        #endregion

        #region Constructores
        public ucCaja()
		{
			this.InitializeComponent();
            listaProcesos = new ucLista();
            proceso = new Proceso();
		}
        public ucCaja(ucLista pLista)
        {
            this.InitializeComponent();
            dgProcesados.DataContext = new Proceso();
            listaProcesos = pLista;
        }
        #endregion

        #region Propiedades de dependencia
        public static DependencyProperty ColorFondo =
            DependencyProperty.Register("Color", typeof(Brush), typeof(ucCaja), new FrameworkPropertyMetadata(new PropertyChangedCallback(ColorAct)));
        /// <summary>
        /// Propiedad que establece el color de fondo del la caja.
        /// </summary>
        public Brush Color
        {
            get { return (Brush)GetValue(ColorFondo); }
            set { SetValue(ColorFondo, value); }
        }

        private static void ColorAct(DependencyObject dpo, DependencyPropertyChangedEventArgs e)
        {
            ucCaja control = (ucCaja)dpo;
            control.lbTarea.Background = e.NewValue as Brush;
            control.pbAvance.Foreground = e.NewValue as Brush;
            control.dgProcesados.Background = e.NewValue as Brush;
        }
        #endregion

        #region Metodos
        private void btnPlay_Click(object sender, RoutedEventArgs e)
      {
          if (!iniciado)  //Si no ha iniciado
          {
              CargarProceso();       //Carga el proceso
              if (proceso != null)   //Si no es nulo
              {
                  proceso.pausarReanudar(); // Lo pausa
                  iniciado = true;
              }
          }
          if (proceso != null && !proceso.estado) // Si no es nulo y su estado el false.
          {
              proceso.pausarReanudar();           //Lo reanuda
              btnPlay.Content = "=";                  
          }
          else
          {
              if (proceso != null)
              {
                  proceso.pausarReanudar();    
                  btnPlay.Content = "P";
              }
          }    
      }
        /// <summary>
        /// Carga un proceso a la caja.
        /// </summary>
      void CargarProceso()
      {
          if (listaProcesos.ListaProc.Count > 0)         //Si la lista de espera no esta vacia.
          {
              proceso = listaProcesos.ListaProc[0];      //Toma el que esta en el tope de la pila. 
              listaProcesos.ListaProc.RemoveAt(0);       //Elimina el que esta en el tope de la pila.
              listaProcesos.GetGrid().ItemsSource = listaProcesos.ListaProc; // Agrega la lista de procesos actualizada al grid.
              proceso.timerProceso.Tick += timerProceso_Tick;                
             // proceso.Velocidad = Convert.ToInt32(slVelocidad.Value.ToString());
              proceso.recal();
              proceso.Iniciar();            //Inicia el proceso.
              atendido = proceso.Nombre;
          }
          else
          {
              proceso = null;                               //Limpia el proceso
              listaProcesos.GetGrid().ItemsSource = null;   //Limpia el grid de la lista de espera.
          }
         
      }
      void timerProceso_Tick(object sender, EventArgs e)
      {
          if (proceso.estado)
          {
              if (proceso.Peso < 100) { pbAvance.Value += 10; }                   //   Aumenta el valor de la barra
              if (proceso.Peso >= 100) { pbAvance.Value++; }                      //    de progreso.
              proceso.Nombre = proceso.Nombre.Trim();
              lbTarea.Content = proceso.Nombre + " TF: " + proceso.getTiempoFaltante();
              //while (ListaAProcesar.Count > 0) { proceso.hilo.Join(); } Podria necesitarlo mas adelante
          }

          if (pbAvance.Value >= 100) //Cuando se completa la barra de estado...
          {
              pbAvance.Value = 0;
              dgProcesados.Items.Insert(0, proceso);        //Se agrega el proceso al DataGrid.
              if (listaProcesos.GetGrid().Items.Count > 0)  //Si la lista de espera no esta vacia.
              {
                  CargarProceso();                          //Carga el siguiente proceso.
              }

              lbTarea.Content = atendido + " finalizado.";
              btnPlay.Content = "P";
              iniciado = false;
          }

      }

      private void btnPause_Click(object sender, RoutedEventArgs e)
      {
          proceso.pausarReanudar();
      }

      private void UserControl_Loaded(object sender, RoutedEventArgs e)
      {

          // No cargue datos en tiempo de diseño.
          // if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
          // {
          // 	//Cargue los datos aquí y asigne el resultado a CollectionViewSource.
          // 	System.Windows.Data.CollectionViewSource myCollectionViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["Resource Key for CollectionViewSource"];
          // 	myCollectionViewSource.Source = your data
          // }
      }
    }
        #endregion
}